package br.edu.ufam.avaliacao

import br.edu.ufam.controleAcesso.Usuario
import br.edu.ufam.academico.Curso
import com.sun.jmx.snmp.Timestamp
import java.text.DateFormat
import java.text.SimpleDateFormat

class AvaliacaoController {

    static allowedMethods = [save: "POST", update: "POST", delete: "POST"]

    def index = {
        redirect(action: "list", params: params)
    }

    def list = {
        params.max = Math.min(params.max ? params.int('max') : 10, 100)
        [avaliacaoInstanceList: Avaliacao.list(params), avaliacaoInstanceTotal: Avaliacao.count()]
    }
    
    def getAvaliacaoPendente (def usuario){
        
        def pendente = Avaliacao.findAll("from Avaliacao a where a.usuario.id = ? and (a.status='Em andamento')", [usuario])
        
        return pendente.size()
        
        
    }
    
        
    def getAvaliacaoPendenteCoordenador (def usuario){
        
        List<Avaliacao> avaliacoes = new ArrayList<Avaliacao>()
        def pendente = Avaliacao.findAll("from Avaliacao a where a.status='Coordenador'")
        println("USUARIO  "+ usuario)
        
        for (Avaliacao avaliacao:pendente){
            println("USUARIO  COORDENADOR  "+avaliacao.curso.coordenador.id)
            if (avaliacao.curso.coordenador.id == usuario)
                avaliacoes.add(avaliacao)
        }
        
        //println("TAMANHO COORDENADOR  "+ avaliacoes.size())
        return avaliacoes.size()
        
        
    }

    def create = {
        def avaliacaoInstance = new Avaliacao()
        avaliacaoInstance.properties = params
        return [avaliacaoInstance: avaliacaoInstance]
    }

    def save = {
        
        
        
        params?.dateStart = Date.parse("dd/MM/yyyy",params?.dateStart)   
        params?.dateEnd = Date.parse("dd/MM/yyyy",params?.dateEnd)
        
        def avaliacaoInstance = new Avaliacao(params)
        
        //println "AVALIADOR " + params?.usuario.id        
        
        def curso = Curso.findAll("from Curso where id="+params?.curso.id+"")
        
        //println "COORDENADOR "+ curso.get(0).coordenador.id
        
        if (params?.usuario.id.equals(curso.get(0).coordenador.id)){
            flash.message = "O avaliador não pode ser o mesmo coordenador do curso avaliado"
            render(view: "create",model: [avaliacaoInstance: avaliacaoInstance])            
        } else {        
        if (avaliacaoInstance.save(flush: true)) {
            flash.message = "${message(code: 'default.created.message', args: [message(code: 'avaliacao.label', default: 'Avaliacao'), avaliacaoInstance.id])}"
            redirect(action: "show", id: avaliacaoInstance.id)
        }
        else {
            render(view: "create", model: [avaliacaoInstance: avaliacaoInstance])
        }
        }
    }

    def show = {
        def avaliacaoInstance = Avaliacao.get(params.id)
        if (!avaliacaoInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'avaliacao.label', default: 'Avaliacao'), params.id])}"
            redirect(action: "list")
        }
        else {
            [avaliacaoInstance: avaliacaoInstance]
        }
        
    }

    def edit = {
        def avaliacaoInstance = Avaliacao.get(params.id)
        if (!avaliacaoInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'avaliacao.label', default: 'Avaliacao'), params.id])}"
            redirect(action: "list")
        }
        else {
            return [avaliacaoInstance: avaliacaoInstance]
        }
    }

    def update = {
        
        params?.dateStart = Date.parse("dd/MM/yyyy",params?.dateStart)   
        params?.dateEnd = Date.parse("dd/MM/yyyy",params?.dateEnd)
        
        def avaliacaoInstance = Avaliacao.get(params.id)
        
        def curso = Curso.findAll("from Curso where id="+params?.curso.id+"")
        
        //println "COORDENADOR "+ curso.get(0).coordenador.id
        
        if (params?.usuario.id.equals(curso.get(0).coordenador.id)){
            flash.message = "O avaliador não pode ser o mesmo coordenador do curso avaliado"
            render(view: "edit",model: [avaliacaoInstance: avaliacaoInstance])            
        } else {        
        
        if (avaliacaoInstance) {
            if (params.version) {
                def version = params.version.toLong()
                if (avaliacaoInstance.version > version) {
                    
                    avaliacaoInstance.errors.rejectValue("version", "default.optimistic.locking.failure", [message(code: 'avaliacao.label', default: 'Avaliacao')] as Object[], "Another user has updated this Avaliacao while you were editing")
                    render(view: "edit", model: [avaliacaoInstance: avaliacaoInstance])
                    return
                }
            }
            avaliacaoInstance.properties = params
            if (!avaliacaoInstance.hasErrors() && avaliacaoInstance.save(flush: true)) {
                flash.message = "${message(code: 'default.updated.message', args: [message(code: 'avaliacao.label', default: 'Avaliacao'), avaliacaoInstance.id])}"
                redirect(action: "show", id: avaliacaoInstance.id)
            }
            else {
                render(view: "edit", model: [avaliacaoInstance: avaliacaoInstance])
            }
        }
        else {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'avaliacao.label', default: 'Avaliacao'), params.id])}"
            redirect(action: "list")
        }
        
        }
    }

    def delete = {
        def avaliacaoInstance = Avaliacao.get(params.id)
        if (avaliacaoInstance) {
            try {
                avaliacaoInstance.delete(flush: true)
                flash.message = "${message(code: 'default.deleted.message', args: [message(code: 'avaliacao.label', default: 'Avaliacao'), params.id])}"
                redirect(action: "list")
            }
            catch (org.springframework.dao.DataIntegrityViolationException e) {
                flash.message = "${message(code: 'default.not.deleted.message', args: [message(code: 'avaliacao.label', default: 'Avaliacao'), params.id])}"
                redirect(action: "show", id: params.id)
            }
        }
        else {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'avaliacao.label', default: 'Avaliacao'), params.id])}"
            redirect(action: "list")
        }
    }
    
    
    def doSearch = {
        
        def parametro
        
        def curso = params.curso
        def avaliador = params.usuario
        Date inicio
        Date fim
                
        DateFormat formatter;
        formatter = new SimpleDateFormat("dd/MM/yyyy");
        
        if(!params.dateStart.isEmpty()){
            inicio = (Date) formatter.parse(params.dateStart);        
        }
        
        if(!params.dateEnd.isEmpty()){
            fim = (Date) formatter.parse(params.dateEnd);
        }
        
        
        
        def avaliacaoInstance
        String query
        
        if (!curso.isEmpty())
        query = "from Avaliacao a where a.curso="+curso+""
        
        if (!avaliador.isEmpty() && query != null)
        query += " and a.usuario='"+avaliador+"'"
        else if (!avaliador.isEmpty() && query == null)
        query = "from Avaliacao a where a.usuario='"+avaliador+"'"
        
        if(inicio != null){
        
        if (!inicio.format("yyyy-MM-dd HH:mm:ss").isEmpty() && query != null)
            query += " and a.dateStart > '"+inicio.format("yyyy-MM-dd HH:mm:ss")+"' or a.dateStart = '"+inicio.format("yyyy-MM-dd HH:mm:ss")+"'"
            else if (!inicio.format("yyyy-MM-dd HH:mm:ss").isEmpty() && query == null)
            query = "from Avaliacao a where a.dateStart > '"+inicio.format("yyyy-MM-dd HH:mm:ss")+"' a.dateStart = '"+inicio.format("yyyy-MM-dd HH:mm:ss")+"'"
        }
        
        if(fim != null){
            if (!fim.format("yyyy-MM-dd HH:mm:ss").isEmpty() && query != null)
            query += " and a.dateEnd < '"+ fim.format("yyyy-MM-dd HH:mm:ss")+"' or a.dateEnd = '"+ fim.format("yyyy-MM-dd HH:mm:ss")+"'"
            else if (!fim.format("yyyy-MM-dd HH:mm:ss").isEmpty() && query == null)
            query = "from Avaliacao a where a.dateEnd < '"+fim.format("yyyy-MM-dd HH:mm:ss")+"' or a.dateEnd = '"+ fim.format("yyyy-MM-dd HH:mm:ss")+"'"
        }
        if (query)
        avaliacaoInstance = Avaliacao.findAll(query)
        else
        avaliacaoInstance = Avaliacao.findAll()
        
        def qtd = avaliacaoInstance.size
        return [avaliacaoInstanceList: avaliacaoInstance, avaliacaoInstanceTotal: qtd, query: query]
    }
    
    
    def chartReport = {
        String query = params.query
        def avaliacaoList = Avaliacao.findAll(query)
        def chartData = formatChartData(avaliacaoList);
        println chartData
        [chartData: chartData]
    }
  
    private String[][] formatChartData(final List avaliacaoList){
        final Calendar calendar = new GregorianCalendar();
        final String[][] chartData = new String[avaliacaoList.size()+1][2];
        chartData[0][0]="'Data'"; chartData[0][1]="'Conceito'"; 
        for(int i = 1; i < avaliacaoList.size()+1;i++){
            int j = i-1;
            calendar.setTime(avaliacaoList.get(j).dateEnd);
            chartData[i][0] = "'Avaliaçao "+calendar.get(Calendar.DAY_OF_MONTH)+"/"+formattedMonth(calendar.get(Calendar.MONTH))+"/"+calendar.get(Calendar.YEAR)+"'";
            chartData[i][1] = avaliacaoList.get(j).conceitoFinal;
        }
        return chartData;
    }
    
    private String formattedMonth(int month){
        month +=1;
        return month<10?"0"+month:String.valueOf(month);
    }
    
    def getResults = {        
        def avaliacaoInstance = Avaliacao.get(params.id)
        //println(avaliacaoInstance)
        
        List<Dimensao> dimensao1 = Dimensao.findAll("from Dimensao d where d.ordem=1")
        
        def indicadores1 = Indicador.findAll("from Indicador i where i.dimensao=? order by i.dimensao,i.ordem",[dimensao1.get(0)])
        
        def respostaCoordenador1 = Resposta.findAll("from Resposta r where r.avaliacao=? and coordenador=? and dimensao=1 order by r.dimensao,r.indicador",[avaliacaoInstance,1])
        def respostaAvaliador1 = Resposta.findAll("from Resposta r where r.avaliacao=? and coordenador=? and dimensao=1 order by r.dimensao,r.indicador",[avaliacaoInstance,0])
        
        def countSame1 = 0;
        def countPositive1 = 0;
        def countNegative1 = 0;
        
        for (int i=0;i<indicadores1.size();i++){
            if (respostaCoordenador1.get(i).conceito==respostaAvaliador1.get(i).conceito)
                countSame1 += 1
            else if (respostaCoordenador1.get(i).conceito<respostaAvaliador1.get(i).conceito)    
               countPositive1 += 1
            else
               countNegative1 += 1
        }
        
        
         List<Dimensao> dimensao2 = Dimensao.findAll("from Dimensao d where d.ordem=2")
        
        def indicadores2 = Indicador.findAll("from Indicador i where i.dimensao=? order by i.dimensao,i.ordem",[dimensao2.get(0)])
        
        def respostaCoordenador2 = Resposta.findAll("from Resposta r where r.avaliacao=? and coordenador=? and dimensao=2 order by r.dimensao,r.indicador",[avaliacaoInstance,1])
        def respostaAvaliador2 = Resposta.findAll("from Resposta r where r.avaliacao=? and coordenador=? and dimensao=2 order by r.dimensao,r.indicador",[avaliacaoInstance,0])
        
        def countSame2 = 0;
        def countPositive2 = 0;
        def countNegative2 = 0;
        
        for (int i=0;i<indicadores2.size();i++){
            if (respostaCoordenador2.get(i).conceito==respostaAvaliador2.get(i).conceito)
                countSame2 += 1
            else if (respostaCoordenador2.get(i).conceito<respostaAvaliador2.get(i).conceito)    
               countPositive2 += 1
            else
               countNegative2 += 1
        }
        
        
        List<Dimensao> dimensao3 = Dimensao.findAll("from Dimensao d where d.ordem=3")
        
        def indicadores3 = Indicador.findAll("from Indicador i where i.dimensao=? order by i.dimensao,i.ordem",[dimensao3.get(0)])
        
        def respostaCoordenador3 = Resposta.findAll("from Resposta r where r.avaliacao=? and coordenador=? and dimensao=3 order by r.dimensao,r.indicador",[avaliacaoInstance,1])
        def respostaAvaliador3 = Resposta.findAll("from Resposta r where r.avaliacao=? and coordenador=? and dimensao=3 order by r.dimensao,r.indicador",[avaliacaoInstance,0])        
        
        def countSame3 = 0;
        def countPositive3 = 0;
        def countNegative3 = 0;
        
        for (int i=0;i<indicadores3.size();i++){
            if (respostaCoordenador3.get(i).conceito==respostaAvaliador3.get(i).conceito)
                countSame3 += 1
            else if (respostaCoordenador3.get(i).conceito<respostaAvaliador3.get(i).conceito)    
               countPositive3 += 1
            else
               countNegative3 += 1
        }
        
        List<Dimensao> dimensao4 = Dimensao.findAll("from Dimensao d where d.ordem=4")
        
        def indicadores4 = Indicador.findAll("from Indicador i where i.dimensao=? order by i.dimensao,i.ordem",[dimensao4.get(0)])
        
        def respostaCoordenador4 = Resposta.findAll("from Resposta r where r.avaliacao=? and coordenador=? and dimensao=4 order by r.dimensao,r.indicador",[avaliacaoInstance,1])
        def respostaAvaliador4 = Resposta.findAll("from Resposta r where r.avaliacao=? and coordenador=? and dimensao=4 order by r.dimensao,r.indicador",[avaliacaoInstance,0])        
               
                
        return [avaliacaoInstance: avaliacaoInstance,indicadores1: indicadores1,respostaCoordenador1: respostaCoordenador1,respostaAvaliador1: respostaAvaliador1,indicadores2: indicadores2,respostaCoordenador2: respostaCoordenador2,respostaAvaliador2: respostaAvaliador2,indicadores3: indicadores3,respostaCoordenador3: respostaCoordenador3,respostaAvaliador3: respostaAvaliador3,indicadores4: indicadores4,respostaCoordenador4: respostaCoordenador4,respostaAvaliador4: respostaAvaliador4,countSame1: countSame1,countPositive1: countPositive1,countNegative1: countNegative1,countSame2: countSame2,countPositive2: countPositive2,countNegative2: countNegative2,countSame3: countSame3,countPositive3: countPositive3,countNegative3: countNegative3]
        
    }

}
